package com.zxg.androidbuslearn.datasave

import android.app.Activity
import android.content.Context
import android.content.Intent
import android.content.SharedPreferences
import android.os.Bundle
import android.preference.PreferenceManager
import android.support.v7.app.AppCompatActivity
import android.widget.Button
import android.widget.CheckBox
import android.widget.EditText
import com.zxg.androidbuslearn.LogUtil
import com.zxg.androidbuslearn.R
import org.jetbrains.annotations.NotNull

/**
 * 作者: 赵小刚
 * 生成时间: 2018/11/19.
 * 版本: 1.0
 * 简介: SharePreferences 存储
 * 修改记录:
 */
class SharedPreferencesActivity : AppCompatActivity() {

    private var nameEd: EditText? = null
    private var passwordEd: EditText? = null
    private var checkBox: CheckBox? = null
    private val mKeyPassword = "password"
    private val mKeyName = "name"

    // 获取SharedPreferences对象
    // 操作模式：
    // MODE_PRIVATE：默认的操作模式，同名文件内容会被覆盖。
    // MODE_APPEND：则表示如果该文件已存在就往文件里面追加内容，不存在就创建新文件。

    /**
     * Context类中的getSharedPreferences(name, mode)方法:
     * 1. name：用于指定SharedPreferences文件的名称。
     * 2. mode：指定操作模式。
     */
//    val sharedPreferences: SharedPreferences = getSharedPreferences("mName", Context.MODE_PRIVATE)
    /**
     * PreferenceManager类中的getDefaultSharedPreferences(context)方法:
     * 1. 这是一个静态方法，使用当前应用程序的包名作为前缀名来命名文件。
     */
//    val sharedPreferences: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
    // 当前不需要共享数据，使用下面这个
    /**
     * Activity类中的getPreferences(mode)方法:
     * 1. mode：指定操作模式。
     * 2. 使用这个方法时会自动将当前活动的类名作为SharedPreferences的文件名。
     * 3. 一般不与其他模块进行共享数据的时才会使用。
     */
    private val sharedPreferences: SharedPreferences
        get() = getPreferences(Activity.MODE_PRIVATE)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_shared_preferences)
        initView()
    }

    // 初始化控件
    private fun initView() {
        nameEd = findViewById(R.id.et_login_name)
        passwordEd = findViewById(R.id.et_login_pwd)
        checkBox = findViewById(R.id.checkbox)
        // 默认读取上次的输入
        nameEd!!.setText(readData(mKeyName).toString())
        passwordEd!!.setText(readData(mKeyPassword).toString())
        val button = findViewById<Button>(R.id.btn_submit)
        button.setOnClickListener {
            if (checkBox!!.isChecked) {
                val name = nameEd!!.text.toString().trim { it <= ' ' }
                val password = passwordEd!!.text.toString().trim { it <= ' ' }
                val nameBool = saveData(name, mKeyName)
                val pwdBool = saveData(password, mKeyPassword)
                LogUtil.logE("bool", nameBool.toString() + "--" + pwdBool.toString())
            } else {
                // 清除保存的数据
                removeData()
            }
//            finish()// 退出当前activity
            val intent = Intent(this, FileActivity::class.java)
            startActivity(intent)
        }
    }

    /**
     * 移除数据
     */
    private fun removeData() {
        val sharedPreferences = sharedPreferences
        // 获取编辑对象
        val editor = sharedPreferences.edit()
        // 移除
        editor.remove(mKeyPassword)
        // 提交
        editor.apply() //后台提交
    }

    /**
     * 清空数据
     */
    private fun clearData() {
        val sharedPreferences = sharedPreferences
        // 获取编辑对象
        val editor = sharedPreferences.edit()
        // 移除
        editor.clear()
        // 提交
        editor.apply() //后台提交
    }

    /**
     * 保存数据
     * @param obj 待保存的数据
     * @param key 键值
     * @return true/false
     */
    private fun saveData(obj: Any, key: String): Boolean {
        var sharedPreferences = sharedPreferences
        // 获取编辑对象
        val editor = sharedPreferences.edit()
        // 添加数据
        editor.putString(key, obj.toString())
        // 提交保存
//        editor.apply() // 后台提交，没有返回值
        return editor.commit() // 马上提交
    }

    /**
     * 读取存储的值
     * @param key 键值
     * @return 待读取的内容
     */
    @Suppress("NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS")
    private fun readData(@NotNull key: String): Any {
        val sharedPreferences = sharedPreferences
        return sharedPreferences.getString(key, "")
    }
}
